python 基础知识 迭代器和生成器

内置集合

在讲迭代器和生成器之前,先要了解Python 共内置了 listtupledictset 四种基本集合,每个 集合对象都能够迭代。

tuple 类型
1
2
3
tup = ('python', 2.7, 64)
for i in tup:
print(i)

程序将以此按行输出 ‘python’, 2.7 和 64。

dictionary 类型
1
2
3
4
5
6
dic = {}
dic['lan'] = 'python'
dic['version'] = 2.7
dic['platform'] = 64
for key in dic:
print(key, dic[key])

输出的结果为:platform 64,lan python, version 2.7, 字典在迭代的过程 中将 key 作为可迭代的对象返回。注意字典中 key 是乱序的,也就是说和插入 的顺序是不一致的。如果想要使用顺序一致的字典,请使用 collections 模块 中的 OrderedDict 对象。

1
2
3
4
5
6
7
8
import collections
d = collections.OrderedDict()
d['a']='A'
d['b']='B'
d['c']='c'
for key in d:
print(key,d[key])
# OrderedDict
set 类型
1
2
3
s = set(['python', 'python2', 'python3','python'])
for item in s:
print(item)

将会输出 python, python3, python2 set 集合将会去除重复项,注意输出的 结果也不是按照输入的顺序。>

为什么会有迭代器和生成器?因为我们有的时候需要这四种集合特殊的规律,比如Fibonacci数列

多种多样的需求肯定不能个个都内建,因此我们需要自己来构建

迭代器

Python 中的 for 句法实际上实现了设计模式中的迭代器模式 ,所以我们自己也可以按照迭代器的要求,自己生成迭代器对象,以便在 for 语句中使用。比如我想要一个迭代器每次循环的次数时按照Fibonacci序列,1,1,2,3,5,8 …… 只要类中实现了 __iter__next 函数,那么对象就可以在 for 语句中使用。 现在创建 Fibonacci 迭代器对象,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# define a Fib class
class Fib(object): #构造类
def __init__(self, max): #init 属性 max
self.max = max
self.n, self.a, self.b = 0, 0, 1 # 初始属性n,属性a,属性b

def __iter__(self): #迭代器用到__iter__函数
return self #该函数会由iter函数调用 返回一个可以迭代的对象~

def __next__(self): #该函数会有next内建函数调用
if self.n < self.max:
r = self.b
self.a, self.b = self.b, self.a + self.b
self.n = self.n + 1
return r
raise StopIteration()

# using Fib object
for i in Fib(5):
print(i)

将会输出前 5 个 Fibonacci 数据 1,1, 2, 3, 5

如果Fib(6),此时这个迭代器输出为1,1,2,3,5,8

生成器

除了使用迭代器以外,Python 使用 yield 关键字也能实现类似迭代的效果,yield 语句每次 执行时,立即返回结果给上层调用者,而当前的状态仍然保留,以便迭代器下一次循环调用。这样做的 好处是在于节约硬件资源,在需要的时候才会执行,并且每次只执行一次。

1
2
3
4
5
6
7
8
9
10
11
def fib(max):
a, b = 0, 1
while max:
r = b
a, b = b, a+b
max -= 1
yield r

# using generator
for i in fib(5):
print(i)

将会输出前 5 个 Fibonacci 数据 1,1, 2, 3, 5

-------------本文结束 谢谢阅读-------------
-------------若有错误欢迎评论-------------
2块钱请我吃根热狗吧,啾咪.⁄( ⁄•⁄ω⁄•⁄ )⁄.